package avaliacao;

import avaliacao.Exception.MailException;
import java.io.InputStream;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * <i>Singleton Pattern</i> Classe utilitária para envio de e-mails.<br/>
 * Necessita de um arquivo de propriedades (mail.properties) no classpath.
 */
public class MailUtil {

    /**
     * <i>Singleton Pattern</i> Instância única
     */
    private static MailUtil instance;
    /**
     * <i>Constante</i><br/> Remetente do e-mail enviado.
     */
    private static final String KEY_FROM = "mail.from";
    /**
     * <i>Constante</i><br/> Servidor de e-mail SMTP (obrigatório).
     */
    private static final String KEY_SMTP_HOST = "mail.smtp.host";
    /**
     * <i>Constante</i><br/> Usuário do servidor de e-mail (não obrigatório).
     */
    private static final String KEY_HOST_USER = "mail.host.user";
    /**
     * <i>Constante</i><br/> Senha do usuário do servidor de e-mail (não
     * obrigatório).
     */
    private static final String KEY_HOST_PASSWD = "mail.host.passwd";
    /**
     * Propriedades de envio de e-mail.<br/> As propriedades são lidas do
     * arquivo <b>mail.properties</b> no classpath.
     */
    private static Properties properties;

    /**
     * <i>Singleton Pattern</i> Construtor privado.<br/> Carrega o arquivo de
     * propriedades (mail.properties).
     */
    private MailUtil() throws MailException {
        try {
            properties = new Properties();

            InputStream stream = MailUtil.class.getResourceAsStream("mail.properties");
            if (stream == null) {
                stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("mail.properties");
            }
            if (stream == null) {
                throw new MailException("Could not load mail properties file.");
            }

            properties.load(stream);
        } catch (Exception e) {
            throw new MailException(e);
        }
    }

    /**
     * <i>Singleton Pattern</i>
     *
     * @return Instância única
     * @throws MailException
     */
    public static MailUtil getInstance() throws MailException {
        if (instance == null) {
            instance = new MailUtil();
        }
        return instance;
    }

    /**
     * Envia um e-mail para um destinatário.
     *
     * @param subject
     *            Assunto do e-mail.
     * @param to
     *            Destinatário do e-mail.
     * @param body
     *            Corpo do e-mail.
     * @throws MailException
     */
    public void send(String subject, String to, String body)
            throws MailException {
        String[] mto = new String[1];
        mto[0] = to;
        send(subject, mto, body);
    }

    /**
     * Envia um e-mail para vários destinatários.
     *
     * @param subject
     *            Assunto do e-mail.
     * @param to
     *            Destinatários do e-mail.
     * @param body
     *            Corpo do e-mail.
     * @throws MailException
     */
    public void send(String subject, String[] to, String body)
            throws MailException {
        try {
            Session sessaoEmail = Session.getInstance(properties, null);

            InternetAddress remetente = new InternetAddress(properties.getProperty(KEY_FROM));
            InternetAddress[] destinatarios = new InternetAddress[to.length];
            for (int i = 0; i < to.length; i++) {
                destinatarios[i] = new InternetAddress(to[i]);
            }

            Message mensagem = new MimeMessage(sessaoEmail);
            remetente.setPersonal("MEC - Avaliação");
            mensagem.setFrom(remetente);
            mensagem.setRecipients(Message.RecipientType.TO, destinatarios);
            mensagem.setSubject(subject);
            mensagem.setContent(body, "text/html");
            mensagem.saveChanges();

            Transport transport = sessaoEmail.getTransport("smtp");
            transport.connect(properties.getProperty(KEY_SMTP_HOST), properties.getProperty(KEY_HOST_USER), properties.getProperty(KEY_HOST_PASSWD));
            transport.sendMessage(mensagem, mensagem.getAllRecipients());
            transport.close();
        } catch (Exception ex) {
            throw new MailException(ex);
        }
    }

    /**
     * Método de execução de teste unitário.
     *
     * @param args
     *            Destinatário.
     */
    public static void main(String[] args) {
        try {
            if (args.length != 1) {
                System.out.println("usage: java MailUtil <to>");
                return;
            }

            String to = args[0];
            MailUtil.getInstance().send("assunto", to, "conteudo teste");
        } catch (MailException e) {
            e.printStackTrace();
        }
    }
}
